﻿using BUGCOME.Infrastructure.Enums;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BUGCOME.Infrastructure.Helper
{
    public static class LocalFileHelper
    {
        /// <summary>
        /// 删除本地文件
        /// </summary>
        public static async Task<bool> DeleteLocalFileAsync(string filePath, string fileName)
        {
            try
            {
                string fullPath = Path.Combine(filePath, fileName);
                if (File.Exists(fullPath))
                {
                    await Task.Run(() => File.Delete(fullPath));
                    // 删除空目录
                    var dir = new DirectoryInfo(filePath);
                    if (dir.GetFiles().Length == 0 && dir.GetDirectories().Length == 0)
                        dir.Delete();
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// 检查指定路径的文件是否存在
        /// </summary>
        /// <param name="fullPath">文件的完整路径</param>
        /// <returns>如果文件存在则返回true，否则返回false</returns>
        public static bool Exists(string fullPath)
        {
            // 调用System.IO.File类的Exists方法检查文件是否存在
            return File.Exists(fullPath);
        }

        /// <summary>
        /// 删除指定路径的文件（如果文件存在）
        /// </summary>
        /// <param name="path">要删除的文件路径</param>
        /// <returns>始终返回true（无论文件是否存在或删除是否成功）</returns>
        public static bool Delete(string path)
        {
            // 先检查文件是否存在
            if (File.Exists(path))
            {
                // 如果文件存在，则调用System.IO.File类的Delete方法删除文件
                File.Delete(path);
            }
            // 无论文件是否存在或删除操作是否成功，均返回true
            return true;
        }
        /// <summary>
        /// 移动文件到新路径
        /// </summary>
        /// <param name="oldFilePath">源文件路径</param>
        /// <param name="newFilePath">目标文件路径</param>
        /// <exception cref="ArgumentNullException">路径为空时抛出</exception>
        /// <exception cref="FileNotFoundException">源文件不存在时抛出</exception>
        /// <exception cref="IOException">IO操作失败时抛出</exception>
        public static void Move(string oldFilePath, string newFilePath)
        {
            // 参数验证
            if (string.IsNullOrWhiteSpace(oldFilePath))
                throw new ArgumentNullException(nameof(oldFilePath), "源文件路径不能为空");

            if (string.IsNullOrWhiteSpace(newFilePath))
                throw new ArgumentNullException(nameof(newFilePath), "目标文件路径不能为空");

            // 检查源文件是否存在
            if (!File.Exists(oldFilePath))
                throw new FileNotFoundException("源文件不存在", oldFilePath);

            // 创建目标目录（如果不存在）
            string targetDirectory = Path.GetDirectoryName(newFilePath);
            if (!Directory.Exists(targetDirectory))
            {
                Directory.CreateDirectory(targetDirectory);
            }

            try
            {
                // 尝试直接移动（同磁盘高效）
                File.Move(oldFilePath, newFilePath, overwrite: true);
            }
            catch (IOException ex) when (ex.HResult == -2147024864) // 跨磁盘移动时的异常
            {
                // 跨磁盘时先复制再删除源文件
                File.Copy(oldFilePath, newFilePath, overwrite: true);
                File.Delete(oldFilePath);
            }
            catch (Exception ex)
            {
                throw new IOException($"移动文件失败: {ex.Message}", ex);
            }
        }

    }



}
